import 'package:flutter/material.dart';

class ParentDraggableWidget extends StatefulWidget {
  late Widget child;
  ParentDraggableWidget(this.child,{super.key});
  
  @override
  _ParentDraggableWidgetState createState() => _ParentDraggableWidgetState();
}

class _ParentDraggableWidgetState extends State<ParentDraggableWidget> {
  // 父组件拖拽偏移量
  double _parentOffset = 0;
  // 子组件是否处于顶部/底部边界
  bool _isAtEdge = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // appBar: AppBar(title: Text('边界传递拖拽事件')),
      body: Stack(
        children: [
          // 父组件（可拖拽）
          Positioned(
            top: _parentOffset,
            left: 0,
            right: 0,
            child: GestureDetector(
              // 父组件的拖拽逻辑（仅在子组件处于边界时生效）
              onVerticalDragUpdate: _isAtEdge
                  ? (details) {
                      setState(() {
                        _parentOffset += details.delta.dy;
                        // 限制父组件拖拽范围（可选）
                        _parentOffset = _parentOffset.clamp(-200, 200);
                      });
                    }
                  : null,
              child: Container(
                height: MediaQuery.of(context).size.height,
                color: Colors.grey[100],
                // 子组件：SingleChildScrollView
                child: NotificationListener<ScrollNotification>(
                  onNotification: (notification) {
                    // 监听子组件滚动状态，判断是否处于顶部/底部
                    final scrollView = notification.metrics;
                    setState(() {
                      _isAtEdge = scrollView.pixels <= 0 || // 顶部边界
                                  scrollView.pixels >= scrollView.maxScrollExtent; // 底部边界
                    });
                    return false; // 不阻止事件传递
                  },
                  child: SingleChildScrollView(
                    // 子组件内容（足够长以产生滚动）
                    child: Container(
                      height: 1500,
                      padding: EdgeInsets.all(20),
                      child: widget.child
                    ),
                  ),
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}
